<?php
namespace app\common\service;

use app\common\service\Base;
use think\facade\Db;
use think\facade\Cache;
//ai聊天接口 - 阿里百炼
class Aichat extends Base {

    public function index(){
        $user_id = $this->user_id;
        
        // 生成会话token
        $token = md5($user_id . time() . rand(1000, 9999));
        
        // 获取当前时间戳
        $nowtime = time();
        
        // 初始化AI聊天会话
        $session_data = [
            'user_id' => $user_id,
            'token' => $token,
            'create_time' => $nowtime,
            'last_time' => $nowtime,
        ];
        
        // 存储会话信息到缓存
        Cache::set('ai_chat_session_'.$token, $session_data, 7200); // 2小时过期
        
        $result = [
            'status' => true,
            'msg' => '',
            'token' => $token,
            'nowtime' => $nowtime
        ];
        
        return $result;
    }
    public function getmessagelist(){
        $user_id = $this->user_id;
        $bid = input('bid', 0);
        $pagenum = input('pagenum', 1);
        $token = input('token', '');
        
        // 验证token是否有效
        $session_data = Cache::get('ai_chat_session_'.$token);
        if (!$session_data || $session_data['user_id'] != $user_id) {
//            return [
//                'status' => false,
//                'msg' => '会话已过期，请重新开始对话',
//                'data' => []
//            ];
        }
        
        // 更新会话最后活动时间
        if ($session_data) {
            // $session_data['last_time'] = time();
            // Cache::set('ai_chat_session_'.$token, $session_data, 7200);
        }
        
        // 从数据库获取聊天记录
        $limit = 10; // 每页显示条数
        $offset = ($pagenum - 1) * $limit;
        
        $message_list = Db::name('ai_chat_message')
            ->where('user_id', $user_id)
            // ->where('session_token', $token)
            ->order('id desc') // 按创建时间倒序，最新的消息在前面
            ->limit($offset, $limit)
            ->select()
            ->toArray();
            
        // 将结果反转，使最早的消息在前面，最新的消息在后面
        // 这样在前端显示时，最新的消息会在底部
        $message_list = array_reverse($message_list);
        
        // 如果是第一页且没有消息，添加一条AI欢迎语
        if ($pagenum == 1 && empty($message_list)) {
            $welcome_message = [
                'id' => 0,
                'user_id' => $user_id,
                'session_token' => $token,
                'content' => '您好，我是AI助手，有什么可以帮助您的吗？',
                'msgtype' => 'text',
                'isreply' => 1, // AI回复
                'createtime' => time(),
                'uheadimg' => getCurUrl().'/static/images/deepseek.png', // AI头像
                'headimg' => '', // 用户头像为空
            ];
            
            $message_list = [$welcome_message];
        }
        
        return [
            'status' => true,
            'msg' => '',
            'data' => $message_list
        ];
    }

    public function sendToAI() {
        $user_id = $this->user_id;
        $token = input('token', '');
        $content = input('content', '');
        $msgtype = input('msgtype', 'text');
        
        // 验证token是否有效
        $session_data = Cache::get('ai_chat_session_'.$token);
        if (!$session_data || $session_data['user_id'] != $user_id) {
//            return [
//                'status' => false,
//                'msg' => '会话已过期，请重新开始对话',
//                'data' => []
//            ];
        }
        
        // 更新会话最后活动时间
        $session_data['last_time'] = time();
        Cache::set('ai_chat_session_'.$token, $session_data, 7200);
        
        // 保存用户发送的消息
        $user_message = [
            'user_id' => $user_id,
            'session_token' => $token,
            'content' => $content,
            'msgtype' => $msgtype,
            'isreply' => 0, // 用户消息
            'createtime' => time(),
            'headimg' => $this->getUserAvatar(), // 获取用户头像
            'uheadimg' => getCurUrl().'/static/images/deepseek.png', // AI头像为空
        ];
        
        // 将用户消息保存到数据库
        $user_message_id = Db::name('ai_chat_message')->insertGetId($user_message);
        
        // 调用阿里百炼API获取回复
        $ai_reply = $this->callBailianAPI($content, $token);
        
        // 保存AI回复
        $ai_message = [
            'user_id' => $user_id,
            'session_token' => $token,
            'content' => $ai_reply,
            'msgtype' => 'text',
            'isreply' => 1, // AI回复
            'createtime' => time(),
            'uheadimg' => getCurUrl().'/static/images/deepseek.png', // AI头像
            'headimg' => getCurUrl().'/static/images/deepseek.png', // 用户头像为空
        ];
        
        // 将AI回复保存到数据库
        $ai_message_id = Db::name('ai_chat_message')->insertGetId($ai_message);
        
        return [
            'status' => true,
            'msg' => '',
            'data' => [
                'user_message' => $user_message,
                'ai_message' => $ai_message
            ]
        ];
    }
    
    // 调用阿里百炼API
    private function callBailianAPI($content, $token) {
        $ai_plate = tpCache('shop.ai_plate')?:'deepseek';
        if($ai_plate=='ali'){
            $api_url = 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions';
            $api_key = tpCache('shop.ali_ai_key');
            $model = tpCache('shop.ali_ai_modle');
        }else{
            $api_url = 'https://api.deepseek.com/chat/completions';
            $api_key = tpCache('shop.deepseek_ai_key');
            $model = tpCache('shop.deepseek_ai_modle');
        }
        // 获取阿里百炼API配置

        // 检查配置是否完整
        if (empty($api_key)) {
            // 配置不完整，返回默认回复
            return '系统配置不完整，请联系管理员配置阿里百炼API。';
        }
        
        try {
            // 获取历史对话记录，增强上下文理解
            $history = $this->getHistoryMessages($token, 5, $content); // 获取最近5条对话记录，并传入当前内容
            
            // 构建请求参数
            $requestParams = [
                'model' => $model ?? 'qwen-plus',
                'messages' => array_merge([
                    [
                        'role' => 'system',
                        'content' => '你是一个有帮助的AI助手。'
                    ]
                ], $history)
            ];
            
            // 准备请求URL和请求体
            $body = json_encode($requestParams);
            
            // 设置请求头
            $headers = [
                'Authorization: Bearer ' . $api_key,
                'Content-Type: application/json'
            ];
            
            // 初始化CURL
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $api_url);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 600);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用SSL证书验证
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不验证主机名
            
            // 发送请求并获取响应
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);

            // 处理响应
            if ($httpCode == 200 && !empty($response)) {
                $result = json_decode($response, true);
                if (isset($result['choices'][0]['message']['content'])) {
                    return $result['choices'][0]['message']['content'];
                } else {
                    // 记录错误日志
                    trace('阿里百炼API返回数据格式异常: ' . $response, 'error');
                    return '抱歉，AI助手暂时无法回答您的问题，请稍后再试。';
                }
            } else {
                // 记录错误日志
                trace('阿里百炼API请求失败: HTTP状态码=' . $httpCode . ', 错误=' . $error . ', 响应=' . $response, 'error');
                return '抱歉，AI助手暂时无法回答您的问题，请稍后再试。';
            }
        } catch (\Exception $e) {
            // 记录异常日志
            trace('调用阿里百炼API异常: ' . $e->getMessage(), 'error');
            
            // 返回友好提示
            return '抱歉，AI助手暂时遇到了一些技术问题，请稍后再试。';
        }
    }
    
    // 获取历史对话记录，用于提供上下文
    private function getHistoryMessages($token, $limit = 5, $currentContent = '') {
        // 从数据库获取历史对话记录
        $history = Db::name('ai_chat_message')
            ->where('session_token', $token)
            ->order('createtime desc')
            ->limit($limit * 2) // 获取用户和AI的对话，所以数量翻倍
            ->select()
            ->toArray();
        
        // 按时间正序排列
        $history = array_reverse($history);
        
        // 构建符合阿里百炼API格式的消息数组
        $messages = [];
        foreach ($history as $msg) {
            $role = $msg['isreply'] == 1 ? 'assistant' : 'user';
            $messages[] = [
                'role' => $role,
                'content' => $msg['content']
            ];
        }
        
        // 添加当前用户的提问
        if (!empty($currentContent)) {
            $messages[] = [
                'role' => 'user',
                'content' => $currentContent
            ];
        }
        
        return $messages;
    }
    
    // 获取用户头像
    private function getUserAvatar() {
        // 从用户表获取头像，这里简化处理
        $avatar = Db::name('users')->where('user_id', $this->user_id)->value('head_pic');
        return $avatar ?: '/static/img/default_avatar.png';
    }
}
